<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh_cn" lang="zh_cn">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
<title>DBUtils 用户指南</title>
<link rel="stylesheet" href="Doc.css" type="text/css" />
</head>
<body>
<div class="document" id="dbutils">
<h1 class="title">DBUtils 用户指南</h1>
<table class="docinfo" frame="void" rules="none">
<col class="docinfo-name" />
<col class="docinfo-content" />
<tbody valign="top">
<tr><th class="docinfo-name">版本:</th>
<td>0.9.4</td></tr>
<tr class="field"><th class="docinfo-name">发行版:</th><td class="field-body">07/07/07</td>
</tr>
<tr class="field"><th class="docinfo-name">翻译:</th><td class="field-body"><a class="reference external" href="UsersGuide.html">English</a> <a class="reference external" href="UsersGuide.de.html">German</a> Chinese</td>
</tr>
</tbody>
</table>
<div class="contents topic" id="id1">
<p class="topic-title first">目录</p>
<ul class="simple">
<li><a class="reference internal" href="#id2" id="id22">摘要</a></li>
<li><a class="reference internal" href="#id3" id="id23">模块</a></li>
<li><a class="reference internal" href="#id4" id="id24">下载</a></li>
<li><a class="reference internal" href="#id5" id="id25">安装</a><ul>
<li><a class="reference internal" href="#id6" id="id26">安装为顶层模块</a></li>
<li><a class="reference internal" href="#webware" id="id27">安装为Webware的子模块(插件)</a></li>
</ul>
</li>
<li><a class="reference internal" href="#id7" id="id28">要求</a></li>
<li><a class="reference internal" href="#id8" id="id29">功能</a><ul>
<li><a class="reference internal" href="#simplepooleddb" id="id30">SimplePooledDB</a></li>
<li><a class="reference internal" href="#steadydb" id="id31">SteadyDB</a></li>
<li><a class="reference internal" href="#persistentdb" id="id32">PersistentDB</a></li>
<li><a class="reference internal" href="#pooleddb" id="id33">PooledDB</a></li>
<li><a class="reference internal" href="#id9" id="id34">该选择哪一个？</a></li>
</ul>
</li>
<li><a class="reference internal" href="#id10" id="id35">使用方法</a><ul>
<li><a class="reference internal" href="#id11" id="id36">PersistentDB</a></li>
<li><a class="reference internal" href="#id12" id="id37">PooledDB</a></li>
<li><a class="reference internal" href="#id13" id="id38">在Webware中使用</a></li>
</ul>
</li>
<li><a class="reference internal" href="#id14" id="id39">注意</a></li>
<li><a class="reference internal" href="#id15" id="id40">未来功能</a></li>
<li><a class="reference internal" href="#id16" id="id41">错误报告与回馈</a></li>
<li><a class="reference internal" href="#id17" id="id42">链接</a></li>
<li><a class="reference internal" href="#id19" id="id43">作者列表</a></li>
<li><a class="reference internal" href="#id20" id="id44">版权与许可</a></li>
</ul>
</div>
<div class="section" id="id2">
<h1>摘要</h1>
<p><a class="reference external" href="http://www.webwareforpython.org/DBUtils">DBUtils</a> 是一套允许线程化 <a class="reference external" href="http://www.python.org">Python</a> 程序可以安全和有效的访问数据库的模块。DBUtils已经作为 <a class="reference external" href="http://www.webwareforpython.org">Webware for Python</a> 一部分用来结合 <a class="reference external" href="http://www.pygresql.org">PyGreSQL</a> 访问 <a class="reference external" href="http://www.postgresql.org">PostgreSQL</a> 数据库，当然他也可以用在其他Python应用程序中来访问 <a class="reference external" href="http://www.python.org/dev/peps/pep-0249/">DB-API 2</a> 兼容的数据库接口。</p>
</div>
<div class="section" id="id3">
<h1>模块</h1>
<p>DBUtils实际上是一个包含两个子模块的Python包，一个用于连接DB-API 2模块，另一个用于连接典型的PyGreSQL模块。</p>
<table border="1" class="docutils">
<colgroup>
<col width="31%" />
<col width="69%" />
</colgroup>
<thead valign="bottom">
<tr><th class="head" colspan="2">全局的DB-API 2变量</th>
</tr>
</thead>
<tbody valign="top">
<tr><td>SteadyDB.py</td>
<td>用于稳定数据库连接</td>
</tr>
<tr><td>PooledDB.py</td>
<td>连接池</td>
</tr>
<tr><td>PersistentDB.py</td>
<td>维持持续的数据库连接</td>
</tr>
<tr><td>SimplePooledDB.py</td>
<td>简单连接池</td>
</tr>
</tbody>
</table>
<table border="1" class="docutils">
<colgroup>
<col width="31%" />
<col width="69%" />
</colgroup>
<thead valign="bottom">
<tr><th class="head" colspan="2">典型的 PyGreSQL 变量</th>
</tr>
</thead>
<tbody valign="top">
<tr><td>SteadyPg.py</td>
<td>稳定PyGreSQL连接</td>
</tr>
<tr><td>PooledPg.py</td>
<td>PyGreSQL连接池</td>
</tr>
<tr><td>PersistentPg.py</td>
<td>维持持续的PyGreSQL连接</td>
</tr>
<tr><td>SimplePooledPg.py</td>
<td>简单的PyGreSQL连接池</td>
</tr>
</tbody>
</table>
<p>对标准DB-API 2模块的依赖如下图所示：</p>
<img alt="dbdep.gif" src="dbdep.gif" />
<p>对典型的PyGreSQL模块依赖如下图所示：</p>
<img alt="pgdep.gif" src="pgdep.gif" />
</div>
<div class="section" id="id4">
<h1>下载</h1>
<p>你可以从 Webware 的网站下载最新版本：</p>
<blockquote>
<a class="reference external" href="http://www.webwareforpython.org/downloads/DBUtils/">http://www.webwareforpython.org/downloads/DBUtils/</a></blockquote>
<p>也可以从Python Package Index来下载：</p>
<blockquote>
<a class="reference external" href="http://www.python.org/pypi/DBUtils/">http://www.python.org/pypi/DBUtils/</a></blockquote>
</div>
<div class="section" id="id5">
<h1>安装</h1>
<div class="section" id="id6">
<h2>安装为顶层模块</h2>
<p>如果你打算在除了Webware之外的程序中使用，推荐安装为顶层模块:</p>
<pre class="literal-block">
python setup.py install
</pre>
</div>
<div class="section" id="webware">
<h2>安装为Webware的子模块(插件)</h2>
<p>如果你只是打算在Webware中使用，则可以按照如下安装:</p>
<pre class="literal-block">
python setup.py install --install-lib=/path/to/Webware
</pre>
<p>替换 <tt class="docutils literal"><span class="pre">/path/to/Webware</span></tt> 为Webware安装的根路径。你还需要运行Webware的安装程序来同时包含DBUtils的文档:</p>
<pre class="literal-block">
cd path/to/Webware
python install.py
</pre>
</div>
</div>
<div class="section" id="id7">
<h1>要求</h1>
<p>DBUtils需要Python2.2或更高的版本。而典型的PyGreSQL则需要PyGreSQL3.4版本或更高。而DB-API 相关的则需要 <a class="reference external" href="http://www.python.org/dev/peps/pep-0249/">DB-API 2</a> 版本或更高的数据库接口模块。</p>
</div>
<div class="section" id="id8">
<h1>功能</h1>
<p>这一节的主要例子面向DB-API 2，但是也适用于典型的PyGreSQL模块。</p>
<div class="section" id="simplepooleddb">
<h2>SimplePooledDB</h2>
<p><tt class="docutils literal"><span class="pre">DBUtils.SimplePooledDB</span></tt> 是一个非常简单的数据库连接池实现。他比完善的 <tt class="docutils literal"><span class="pre">PooledDB</span></tt> 模块缺少很多功能。 <tt class="docutils literal"><span class="pre">DBUtils.SimplePooledDB</span></tt> 本质上类似于 <tt class="docutils literal"><span class="pre">MiscUtils.DBPool</span></tt> 这个Webware的组成部分。你可以把它看作一种演示程序。</p>
</div>
<div class="section" id="steadydb">
<h2>SteadyDB</h2>
<p><tt class="docutils literal"><span class="pre">DBUtils.SteadyDB</span></tt> 是一个模块实现了&quot;强硬&quot;的数据库连接，基于DB-API 2建立的原始连接。一个&quot;强硬&quot;的连接意味着在连接关闭之后，或者使用次数操作限制时会重新连接。</p>
<p>一个典型的例子是数据库重启时，而你的程序仍然在运行并需要访问数据库，或者当你的程序连接了一个防火墙后面的远程数据库，而防火墙重启时丢失了状态时。</p>
<p>一般来说你不需要直接使用 <tt class="docutils literal"><span class="pre">SteadyDB</span></tt> 它只是给接下来的两个模块提供基本服务， <tt class="docutils literal"><span class="pre">PersistentDB</span></tt> 和 <tt class="docutils literal"><span class="pre">PooledDB</span></tt> 。</p>
</div>
<div class="section" id="persistentdb">
<h2>PersistentDB</h2>
<p><tt class="docutils literal"><span class="pre">DBUtils.PersistentDB</span></tt> 实现了强硬的、线程安全的、顽固的数据库连接，使用DB-API 2模块。如下图展示了使用 <tt class="docutils literal"><span class="pre">PersistentDB</span></tt> 时的连接层步骤：</p>
<img alt="persist.gif" src="persist.gif" />
<p>当一个线程首次打开一个数据库连接时，一个连接会打开并仅供这个线程使用。当线程关闭连接时，连接仍然持续打开供这个线程下次请求时使用这个已经打开的连接。连接在线程死亡时自动关闭。</p>
<p>简单的来说 <tt class="docutils literal"><span class="pre">PersistentDB</span></tt> 尝试重用数据库连接来提高线程化程序的数据库访问性能，并且他确保连接不会被线程之间共享。</p>
<p>因此， <tt class="docutils literal"><span class="pre">PersistentDB</span></tt> 可以在底层DB-API模块并非线程安全的时候同样工作的很好，并且他会在其他线程改变数据库会话或者使用多语句事务时同样避免问题的发生。</p>
</div>
<div class="section" id="pooleddb">
<h2>PooledDB</h2>
<p><tt class="docutils literal"><span class="pre">DBUtils.PooledDB</span></tt> 实现了一个强硬的、线程安全的、有缓存的、可复用的数据库连接，使用任何DB-API 2模块。如下图展示了使用 <tt class="docutils literal"><span class="pre">PooledDB</span></tt> 时的工作流程：</p>
<img alt="pool.gif" src="pool.gif" />
<p>如图所示 <tt class="docutils literal"><span class="pre">PooledDB</span></tt> 可以在不同线程之间共享打开的数据库连接。这在你连接并指定 <tt class="docutils literal"><span class="pre">maxshared</span></tt> 参数，并且底层的DB-API 2接口是线程安全才可以，但是你仍然可以使用专用数据库连接而不在线程之间共享连接。除了共享连接以外，还可以设立一个至少 <tt class="docutils literal"><span class="pre">mincached</span></tt> 的连接池，并且最多允许使用 <tt class="docutils literal"><span class="pre">maxcached</span></tt> 个连接，这可以同时用于专用和共享连接池。当一个线程关闭了一个非共享连接，则会返还到空闲连接池中等待下次使用。</p>
<p>如果底层DB-API模块是非线程安全的，线程锁会确保使用 <tt class="docutils literal"><span class="pre">PooledDB</span></tt> 是线程安全的。所以你并不需要为此担心，但是你在使用专用连接来改变数据库会话或执行多命令事务时必须小心。</p>
</div>
<div class="section" id="id9">
<h2>该选择哪一个？</h2>
<p><tt class="docutils literal"><span class="pre">PersistentDB</span></tt> 和 <tt class="docutils literal"><span class="pre">PooledDB</span></tt> 都是为了重用数据库连接来提高性能，并保持数据库的稳定性。</p>
<p>所以选择何种模块，可以参考上面的解释。 <tt class="docutils literal"><span class="pre">PersistentDB</span></tt> 将会保持一定数量的连接供频繁使用。在这种情况下你总是保持固定数量的连接。如果你的程序频繁的启动和关闭线程，最好使用 <tt class="docutils literal"><span class="pre">PooledDB</span></tt> 。后面将会提到更好的调整，尤其在使用线程安全的DB-API 2模块时。</p>
<p>当然，这两个模块的接口是很相似的，你可以方便的在他们之间转换，并查看哪个更好一些。</p>
</div>
</div>
<div class="section" id="id10">
<h1>使用方法</h1>
<p>所有模块的使用方法都很相似，但是在初始化 &quot;Pooled&quot; 和 &quot;Persistent&quot; 时还有有些不同，尤其是DB-API和PyGreSQL之间。</p>
<p>这里只讲解 <tt class="docutils literal"><span class="pre">PersistentDB</span></tt> 和更复杂的 <tt class="docutils literal"><span class="pre">PooledDB</span></tt> 模块。其他模块的细节请参与其文档。使用Python解释器控制台，你可以显示 <tt class="docutils literal"><span class="pre">PooledDB</span></tt> 的文档，如下:</p>
<pre class="literal-block">
help(PooledDB)
</pre>
<div class="section" id="id11">
<h2>PersistentDB</h2>
<p>为了使用 <tt class="docutils literal"><span class="pre">PersistentDB</span></tt> 你首先需要通过创建 <tt class="docutils literal"><span class="pre">PersistentDB</span></tt> 的实例来设置一个特定数据库连接的生成器，床底如下参数：</p>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">creator</span></tt>: 可以使用任意返回 <a class="reference external" href="http://www.python.org/dev/peps/pep-0249/">DB-API 2</a> 连接对象的函数活 <cite>DB-API 2</cite> 兼容的数据库模块。</li>
<li><tt class="docutils literal"><span class="pre">maxusage</span></tt>: 一个连接最大允许复用次数(缺省为 <tt class="docutils literal"><span class="pre">0</span></tt> 或 <tt class="docutils literal"><span class="pre">False</span></tt> 意味着无限制的重用)，当达到限制时，将会重新连接数据库</li>
<li><tt class="docutils literal"><span class="pre">setsession</span></tt>: 一个可选的SQL命令列表可以用于准备会话，如 <tt class="docutils literal"><span class="pre">[&quot;set</span> <span class="pre">datestyle</span> <span class="pre">to</span> <span class="pre">german&quot;,</span> <span class="pre">...]</span></tt></li>
<li><tt class="docutils literal"><span class="pre">creator</span></tt> 函数或生成 <a class="reference external" href="http://www.python.org/dev/peps/pep-0249/">DB-API 2</a> 连接的函数，可以接受这里的附加参数，比如主机名、数据库、用户名、密码等等。你也可以选择传递给 <tt class="docutils literal"><span class="pre">creator</span></tt> 的其他参数，并允许提供失败重连和负载均衡。</li>
</ul>
<p>举个例子，如果你正在使用 <tt class="docutils literal"><span class="pre">pgdb</span></tt> 作为数据库模块并想要连接本机数据库 <tt class="docutils literal"><span class="pre">mydb</span></tt> ，允许重用1000次:</p>
<pre class="literal-block">
import pgdb # import used DB-API 2 module
from DBUtils.PersistentDB import PersistentDB
persist = PersistentDB(pgdb, 1000, database='mydb')
</pre>
<p>按照如上设置完成了连接生成器之后，你可以按照如下来请求一个连接:</p>
<pre class="literal-block">
db = persist.connection()
</pre>
<p>你可以使用这些连接就像使用原始的DB-API 2连接一样。实际上你得到的是一个通过``SteadyDB``得到的强硬的连接，基于DB-API 2。</p>
<p>关闭一个强硬的连接使用 <tt class="docutils literal"><span class="pre">db.close()</span></tt> ，这在内部实际上被忽略掉了，并且供下次使用。在线程关闭时，也会自动关闭数据库连接。你可以改变这个行为通过 <tt class="docutils literal"><span class="pre">persist._closeable</span></tt> 为 <tt class="docutils literal"><span class="pre">True</span></tt> 。</p>
</div>
<div class="section" id="id12">
<h2>PooledDB</h2>
<p>为了使用 <tt class="docutils literal"><span class="pre">PooledDB</span></tt> 模块，你首先需要通过创建 <tt class="docutils literal"><span class="pre">PooledDB</span></tt> 来设置数据库连接池，传递如下参数：</p>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">creator</span></tt>: 可以生成 <a class="reference external" href="http://www.python.org/dev/peps/pep-0249/">DB-API 2</a> 连接的任何函数或 <a class="reference external" href="http://www.python.org/dev/peps/pep-0249/">DB-API 2</a> 兼容的数据库连接模块。</li>
<li><tt class="docutils literal"><span class="pre">mincached</span></tt> : 启动时开启的空连接数量(缺省值 <tt class="docutils literal"><span class="pre">0</span></tt> 意味着开始时不创建连接)</li>
<li><tt class="docutils literal"><span class="pre">maxcached</span></tt>: 连接池使用的最多连接数量(缺省值 <tt class="docutils literal"><span class="pre">0</span></tt> 代表不限制连接池大小)</li>
<li><tt class="docutils literal"><span class="pre">maxshared</span></tt>: 最大允许的共享连接数量(缺省值 <tt class="docutils literal"><span class="pre">0</span></tt> 代表所有连接都是专用的)如果达到了最大数量，被请求为共享的连接将会被共享使用。</li>
<li><tt class="docutils literal"><span class="pre">maxconnections</span></tt>: 最大允许连接数量(缺省值 <tt class="docutils literal"><span class="pre">0</span></tt> 代表不限制)</li>
<li><tt class="docutils literal"><span class="pre">blocking</span></tt>: 设置在达到最大数量时的行为(缺省值 <tt class="docutils literal"><span class="pre">0</span></tt> 或 <tt class="docutils literal"><span class="pre">False</span></tt> 代表返回一个错误；其他代表阻塞直到连接数减少)</li>
<li><tt class="docutils literal"><span class="pre">maxusage</span></tt>: 单个连接的最大允许复用次数(缺省值 <tt class="docutils literal"><span class="pre">0</span></tt> 或 <tt class="docutils literal"><span class="pre">False</span></tt> 代表不限制的复用)。当达到最大数值时，连接会自动重新连接(关闭和重新打开)</li>
<li><tt class="docutils literal"><span class="pre">setsession</span></tt>: 一个可选的SQL命令列表用于准备每个会话，如 <tt class="docutils literal"><span class="pre">[&quot;set</span> <span class="pre">datestyle</span> <span class="pre">to</span> <span class="pre">german&quot;,</span> <span class="pre">...]</span></tt></li>
<li><tt class="docutils literal"><span class="pre">creator</span></tt> 函数或可以生成连接的函数可以接受这里传入的其他参数，例如主机名、数据库、用户名、密码等。你还可以选择传入creator函数的其他参数，允许失败重连和负载均衡。</li>
</ul>
<p>举个例子，如果你正在使用 <tt class="docutils literal"><span class="pre">pgdb</span></tt> 作为DB-API模块，并希望连接池中至少有5个连接到数据库 <tt class="docutils literal"><span class="pre">mydb</span></tt></p>
<pre class="literal-block">
import pgdb # import used DB-API 2 module
from DBUtils.PooledDB import PooledDB
pool = PooledDB(pgdb, 5, database='mydb')
</pre>
<p>一旦设置好了连接池，你就可以按照如下请求一个连接:</p>
<pre class="literal-block">
db = pool.connection()
</pre>
<p>你可以使用这些连接有如原始的DB-API 2一样。而实际使用的是``SteadyDB``版本的强硬连接。</p>
<p>请注意连接可以与其他线程共享，只要你设置 <tt class="docutils literal"><span class="pre">maxshared</span></tt> 参数为非零，并且DB-API 2模块也允许。如果你想要使用专用连接则使用:</p>
<pre class="literal-block">
db = pool.connection(0)
</pre>
<p>如果你不再需要这个连接了，则可以返回给连接池使用 <tt class="docutils literal"><span class="pre">db.close()</span></tt> 。你也可以使用相同的方法获取另一个连接。</p>
<p><em>警告：</em> 在一个多线程环境，不要使用下面的方法:</p>
<pre class="literal-block">
pool.connection().cursor().execute(...)
</pre>
<p>这将会导致过早的释放连接以供复用，而且如果是非线程安全还会出错。确保连接对象在你的使用过程中是一直存在的，例如:</p>
<pre class="literal-block">
db = pool.connection()
cur = db.cursor()
cur.execute(...)
res = cur.fetchone()
cur.close() # or del cur
db.close() # or del db
</pre>
</div>
<div class="section" id="id13">
<h2>在Webware中使用</h2>
<p>如果你正在 <a class="reference external" href="http://www.webwareforpython.org">Webware for Python</a> 的 servlets 中使用DBUtils来存取数据库，你要确保数据库连接生成器只被应用启动一次，而不是每个servlet启动时都创建一个。为了达到这个目的，你可以在模块或类的初始化代码中添加这些代码，或者使用 <tt class="docutils literal"><span class="pre">__init__.py</span></tt> 中的 <tt class="docutils literal"><span class="pre">contextInitialize()</span></tt> 函数。</p>
<p>目录 <tt class="docutils literal"><span class="pre">Examples</span></tt> 是DBUtils发行包的一部分，包含了一个使用示例数据库的Webware的例子，用来跟踪演讲会的出席者(这个例子的主意来自Andrew Kuchling的 &quot;<a class="reference external" href="http://www.linuxjournal.com/article/2605">The Python DB-API</a>&quot;)。</p>
<p>例子的正文可以通过创建配置文件 <tt class="docutils literal"><span class="pre">Configs/Database.config</span></tt> 来配置，改变例子
<tt class="docutils literal"><span class="pre">Examples/DBUtilsExample.py</span></tt> 的缺省参数。这种方式可以设置一个专用数据库的用户名和密码，你也可以选择底层的数据库模块。如果设置了 <tt class="docutils literal"><span class="pre">maxcached</span></tt> ，则例子会使用 &quot;Pooled&quot; 模块，否则会使用 &quot;Persistent&quot; 模块。</p>
</div>
</div>
<div class="section" id="id14">
<h1>注意</h1>
<p>如果你正在使用一个流行的ORM <a class="reference external" href="http://www.sqlobject.org">SQLObject</a> 或 <a class="reference external" href="http://www.sqlalchemy.org">SQLAlchemy</a> ，你并不需要使用DBUtiils，因为他已经内含连接池了。 <a class="reference external" href="http://www.sqlobject.org/2/">SQLObject 2</a> (<a class="reference external" href="http://www.sqlobject.org/sqlapi/">SQL-API</a>) 事实上还从DBUtils这里借用了连接池分层的代码。</p>
</div>
<div class="section" id="id15">
<h1>未来功能</h1>
<p>一些未来会使用的方法：</p>
<ul class="simple">
<li>一个连接最大被使用的次数，或一个连接最大活动时间。</li>
<li>创建模块 <tt class="docutils literal"><span class="pre">MonitorDB</span></tt> 和 <tt class="docutils literal"><span class="pre">MonitorPg</span></tt> 运行在单独的线程中，监控连接池中各个共享连接的状态。如果检测到一个损坏的连接，则会自动恢复这个连接。这在很多网站中是很实用的，因为晚上往往要重启数据库服务器。如果不使用监控线程，则用户要等到第二天早上才可以使用。正是因为如此，检测损坏的连接并自动恢复是很有用的。使用了监控线程之后，间断时间在晚上，而且很短。监控线程同样可以配置连接生成器的线程池，并且确保用户到达之前完成。</li>
<li>可选的日志，记录损坏的连接和最大限制。</li>
</ul>
</div>
<div class="section" id="id16">
<h1>错误报告与回馈</h1>
<p>请将错误报告、补丁、回馈直接发送给作者(使用下面给出的邮件地址)。</p>
<p>如果有Webware相关的问题，可以到邮件列表讨论 <a class="reference external" href="https://lists.sourceforge.net/lists/listinfo/webware-discuss">Webware for Python mailing list</a> 。</p>
</div>
<div class="section" id="id17">
<h1>链接</h1>
<p>一些相关软件的链接：</p>
<ul class="simple">
<li><a class="reference external" href="http://www.webwareforpython.org/DBUtils">DBUtils</a></li>
<li><a class="reference external" href="http://www.python.org">Python</a></li>
<li><a class="reference external" href="http://www.webwareforpython.org">Webware for Python</a> 框架</li>
<li>Python <a class="reference external" href="http://www.python.org/dev/peps/pep-0249/">DB-API 2</a></li>
<li><a class="reference external" href="http://www.postgresql.org">PostgreSQL</a> 数据库</li>
<li><a class="reference external" href="http://www.pygresql.org">PyGreSQL</a> 接口</li>
<li><a class="reference external" href="http://www.sqlobject.org">SQLObject</a> ORM</li>
<li><a class="reference external" href="http://www.sqlalchemy.org">SQLAlchemy</a> ORM</li>
</ul>
</div>
<div class="section" id="id19">
<h1>作者列表</h1>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field"><th class="field-name">作者:</th><td class="field-body">Christoph Zwerschke &lt;<a class="reference external" href="mailto:cito&#64;online.de">cito&#64;online.de</a>&gt;</td>
</tr>
<tr class="field"><th class="field-name">贡献:</th><td class="field-body">DBUtils收到了如下朋友的帮助和建议
Ian Bicking, Chuck Esterbrook (Webware for Python), Dan Green (DBTools),
Jay Love, Michael Palmer, Tom Schwaller, Geoffrey Talvola,
Warren Smith (DbConnectionPool) and Ezio Vernacotola.</td>
</tr>
<tr class="field"><th class="field-name">翻译:</th><td class="field-body">gashero &lt;<a class="reference external" href="mailto:harry.python&#64;gmail.com">harry.python&#64;gmail.com</a>&gt;</td>
</tr>
</tbody>
</table>
</div>
<div class="section" id="id20">
<h1>版权与许可</h1>
<p>Copyright &#64; 2005-2007 by Christoph Zwerschke.
All Rights Reserved.</p>
<p>DBUtils是一个自由开源软件，使用 <a class="reference external" href="http://www.opensource.org/licenses/osl-2.1.php">Open Software License version 2.1</a> 许可。</p>
</div>
</div>
</body>
</html>
